package com.kt.common.clazz.object1

/**
 * note:
 * 1.对象表达式是在使用他们的地方立即执行（及初始化）的； val a = object: A{override fun accept(){}} 类似这种
 * 2.对象声明是在第一次被访问到时延迟初始化的；  object DataProviderManager {}
 * 3.伴生对象的初始化是在相应的类被加载（解析）时，与 Java 静态初始化器的语义相匹配。 companion object{}
 */


fun main() {
    //println(a.y)
    //DataProviderManager.registerDataProvider(DataProvider("jdbc"))
    /*val create = MyClass.create()
    val create1 = MyClass.create()
    println(create == create1)*/
    val create = MyClass1.create()
    val create1 = MyClass1.create()
    println(create)
    println(create1)
}


open class A(x: Int) {
    public open val y: Int = x
}

interface B { /*……*/ }

val a: A = object : A(x = 1), B {
    override val y: Int
        get() = super.y + 3
}


//，匿名对象可以用作只在本地和私有作用域中声明的类型
fun foo() {
    val adHoc = object {
        val a: Int = 1
        val b: Int = 1
    }
    println(adHoc.a)
    println(adHoc.b)
}

// 私有函数，所以其返回类型是匿名对象类型
private fun foo1() = object {
    val x: String = "x"
}

// 公有函数，所以其返回类型是 Any
fun publicFoo() = object {
    val x: String = "x"
}

fun bar() {
    //只有私有函数、属性才能调用
    /*val x1 = foo1().x        // 没问题
    val x2 = publicFoo().x  // 错误：未能解析的引用“x”*/
}

